package com.ftx.common.algorithm;

import java.util.LinkedList;
import java.util.Queue;

/**
 * Created by fengtingxin on 2020-07-07.
 **/
public class Solution {

//    public boolean hasPathSum(TreeNode root, int sum) {
//        if (root == null){
//            return false;
//        }
//        //路径总和
//        //方法一：广度优先搜索
//        //节点队列
//        Queue<TreeNode> nodeQueue = new LinkedList<>();
//
//        //节点对应的之前的值的和队列
//        Queue<Integer> valueQueue = new LinkedList<>();
//
//        //放到队列中
//        nodeQueue.offer(root);
//        valueQueue.offer(root.val);
//
//        while(!nodeQueue.isEmpty()){
//            //从队列中取出节点和值
//            TreeNode now = nodeQueue.poll();
//            int temp = valueQueue.poll();
//
//            //如果当前节点的左节点和右节点都是空，说明到了最后一层则判断是否同要求的sum相等
//            if (now.left == null && now.right == null) {
//                if (temp == sum) {
//                    return true;
//                }
//
//                //这里说明如果中间有某个叶子节点，那么直接跳过，同时，这里也会把他之前增加的数量poll掉
//                continue;
//            }
//            //这样，每一次，
//            if (now.left != null){
//                nodeQueue.offer(now.left);
//                valueQueue.offer(temp + now.left.val);
//            }
//
//            if (now.right != null){
//                nodeQueue.offer(now.right);
//                valueQueue.offer(temp + now.right.val);
//            }
//        }
//        return false;
//    }


    public boolean hasPathSum(TreeNode root, int sum) {
        if (root == null){
            return false;
        }
        //路径总和
        //方法二：递归
        //假定从根节点到当前节点的值之和为 val，我们可以将这个大问题转化为一个小问题：
        // 是否存在从当前节点的子节点到叶子的路径，满足其路径和为 sum - val

        //如果两个都为空，说明是叶子节点
        if (root.left == null && root.right == null){
            return sum == root.val;
        }
        //递归左节点和右节点
        return hasPathSum(root.left,sum-root.val) || hasPathSum(root.right,sum-root.val);
    }


    class TreeNode {
     int val;
     TreeNode left;
     TreeNode right;
     TreeNode(int x) { val = x; }
    }


}
